“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。
地址:https://zhuanlan.zhihu.com/p/380016283
01
题目:Learning High-Precision Bounding Box for Rotated Object Detection via Kullback-Leibler Divergence链接:https://arxiv.org/abs/2106.01883代码:https://github.com/yangxue0827/RotationDetection效果比较:不加任何数据增强、多尺度训练和测试等tricks下,将RetinaNet-Res50上的Smooth L1 Loss换成KLD,模型在DOTA1.0数据集上的 从65.73%提高到71.28%, 从32.31%提升到44.48%。已经看过GWD的朋友可能会有这样子的想法:“这篇论文不就是把Wasserstein Distance换成了Kullback-Leibler Divergence了吗?”。说的其实没错,但是有点片面了,这篇文章主要贡献是从理论上分析为什么Kullback-Leibler Divergence会比Wasserstein Distance要好。具体来说,GWD的侧重点在于分析将框的表示从 转换成二维高斯分布 的好处,也就是解决了边界问题、类正方形检测问题、损失和评估不一致问题。而这篇文章从在这个基础上继续探究转换参数之后使用什么样分布距离度量方式比较好,主要从高精度检测和尺度不变性来解释,并给出了理论上的证明。02
对于常见的通用检测模型(水平框检测),模型通常是通过回归四个偏移量的形式来进行框位置和大小的预测:
借鉴于此,目前绝大多数的旋转目标检测在上面的基础上加上了角度参数的回归:
其中 用于处理角度周期性的函数,比如三角函数、取余函数等。
很明显这种扩展方式属于归纳法。五个参数独立优化使得我们需要根据不同的数据集特点进行权重的调整,比如大长宽比目标可能需要着重关注角度参数,小目标则需要关注中心点参数,因此这些参数的轻微偏移都会造成这些目标预测精准度(IoU)的急剧下降。
03
为了打破归纳式(induction)的设计范式,我们计划采用演绎(deduction)设计范式,两者的比较如下图所示:水平框作为旋转框的一种特殊情况,我认为从水平检测的回归损失扩展出旋转回归损失是不准确的(图a)。尽管我们常说水平检测为“通用检测”,但从算法设计上来看旋转检测显得更加“通用”。因此我们采用了图b的设计思路,先单独设计旋转回归损失(这个损失无法简单从水平回归损失扩展出来),然后这个损失在水平情况下可以推导出水平回归损失。和GWD的做法一致,我们先把旋转矩形 转换成一个二维的高斯分布 :
GWD的这种做法解决了边界问题、类正方形检测问题、损失和评估不一致问题。但是这篇文章的重点不是这,而是找到比Wasserstein Distance更适合旋转检测的分布度量。先回顾一下Wasserstein Distance的公式:
由这个公式可以看到,Wasserstein Distance可以分为两项,一项是两个分布(旋转矩形)中心点的欧式距离,另一项是关于 三项的耦合项。尽管这个耦合项的引入有利于高精度检测,但是第一项的单独优化会使得检测结果中心点出现偏移(具体原因我们会在后面分析)。另外,第一项还使得GWD不具备尺度不变性,从这看当初使用GWD来近似IoU loss有点名不副实了。
再来看一下在水平情况下,即 ,上式就可以化简成如下公式:
这和水平框检测使用的回归损失就很像了,只不过一个是通过偏移量来计算损失, 一个是通过绝对坐标来计算损失了。从这看出,GWD也算是属于演绎法的一种,只不过这个损失函数并不完美。
总结一下GWD的缺点:1)中心点单独优化会出现检测结果的位置偏移。2)不具备尺度不变性。3)水平情况下退化出来的回归损失和常用的回归损失还是存在不一致(这个不重要)。3.2 Kullback-Leibler Divergence接下来就正式介绍文章的重头戏了,Kullback-Leibler Divergence (KLD)为何能弥补上面的三个缺点。首先我们来看一下KLD的具体表达式,由于KLD具有不对称性,它有两种形式,分别如下:
和GWD一样也是参数半耦合的,但是它的第一项中引入了 ,这个对于中心点的优化起了非常大的作用。在 中,部分不同参数耦合优化,形成了一种链式耦合的关系。尽管两者区别挺大,但我们发现它们优化的机制是差不多的,这里就以简单的 来作为示例。首先我们将式子中的三项列出来:
我们通过梯度(公式一时爽,求导火葬场)来进行分析,为何KLD为何适合于高精度的旋转检测。不失一般性,我们令 ,则有
权重 和 使得模型可以根据目标的尺度来动态调整权重。比如,当目标非常小或者某一条边比较短的时候,模型会增大相应方向的梯度,以慎重进行位置的偏移的优化。因为对于这类目标来说,很小的位置偏移都会造成IoU的急剧下降。当 时,目标的偏移量( 和 )的梯度会根据角度进行动态调整以提供更好的优化。相比之下,GWD和 关于偏移量的梯度分别是 和
。前者既和角度参数无关,也不会根据目标的尺度来进行动态调整。后者尽管也有权重 和 ,但这是anchor的两边,对于使用水平anchor来说的绝大多数旋转检测器来说,这个是不够准确的,因为水平anchor的长宽无法反映实际目标的尺寸(尤其在目标有一定倾斜角的时候)。先看一下三种方法的可视化对比:
可以看到Smooth L1 loss和GWD的中心点都有轻微的偏移,而KLD就十分准确,这是KLD能实现高精度旋转检测的其中一点。分析到这里,让我对使用旋转还是水平anchor有了一些新的理解,这些内容文章中没有写。回顾我之前的工作RDet,我在选baseline的时候做过使用水平anchor和旋转anchor的实验。水平anchor可以提供较高的recall(水平anchor与gt的水平外接矩形的IoU作为样本采样的依据),而且需要设置的anchor比较少,但是anchor质量不佳(anchor与gt的IoU不高);而旋转anchor尽管能提供较高质量的样本,但是需要设置的anchor数量巨大且能匹配到的正样本数量少,即recall低。这两种方法的可视化情况是,水平anchor的方法在密集场景预测目标的中心点偏移严重,而旋转anchor则预测的比较准,下图所示:一开始我以为是因为水平anchor的样本质量太差,会引入过多干扰信息,但现在一想,在image-level(全卷积形式,另一种是二阶段那种全链接形式的instance-level)的预测方式下,中心点的优化好像和anchor是什么形式没啥关系(全链接的形式可能就有关系了,因为回把一块区域裁剪下来,这块区域包含很多背景噪声区域,影响进一步的回归预测),因为不管是水平还是旋转anchor,它们中心点是同个地方。旋转还是水平的anchor对 参数的影响会比较大。现在总算明白了,偏移的现象和中心点参数梯度的权重有关,旋转anchor能提供高质量的先验,它的长宽和gt接近( ),所以基于旋转anchor的方法中心点偏移不严重,而水平anchor的长宽没法反应实际gt的尺寸大小,因此偏移严重。一种解决办法是像R Det一样,加一个精修阶段,在精修阶段中水平anchor已经被回归成靠近gt的旋转框了,那么精修阶段的候选框相当于旋转anchor一样,最后中心点偏移也就不严重了。
我们可以看到, 两边 和 的梯度和角度差 有关。当 时,
,这意味着较小的目标尺度会导致其匹配到更大的损失。 这是符合认知的,因为较小的边需要更高的匹配精度。再来看角度参数的梯度:
角度差 的优化又受到 和 的的影响。当 时,我们有
,当目标是正方形( )的时候取到等号。而当目标长宽比慢慢变大的时候,整个式子的值就会变大,也就是意味着对角度优化更加看重。这个优化机制是非常好的,我们知道对于长宽比越大的目标来说,它受角度差的影响就越大,IoU会产生急剧下降。这是KLD能实现高精度旋转检测的另一个重要原因,从上上图来看,KLD角度的预测更加精准。我们来看一下三种损失函数对于每个参数梯度的直观比较:
1)对于参数 和 ,KLD在短边方向上的梯度值变化非常明显,而GWD和 并不受边的长短的影像;2)对于 he ,KLD也具有上条差不多的性质,且这种变化对于长宽比越大的目标表现的越明显;3)对于 ,KLD会根据长宽比的增大而动态增大梯度。相比之下,GWD也有相近的性质,但是变化更弱,而 对 的优化不受长宽比的影响。 虽然求导更加复杂,但是结论是基本一致的,求导过程可以看文章的附录部分。很明显,GWD和 不具有尺度不变性,那么我们接下来证明KLD具有这一性质。对于两个已知的高斯分布 和 ,假设有一个满秩的矩阵 ( ),我们有 :
我们将其分别标记为 和 ,那么它们的KLD计算如下:
因此KLD其实是具有仿射不变性的,包括了尺度不变性。当 ( 表示单位矩阵)时,KLD的尺度不变性就被证明了。相比于GWD和 ,KLD更能近似不可导的旋转IoU损失来解决损失与评估不一致的问题。下图比较了三个损失函数关于在不同尺度下的曲线变化:
我们在论文中对KLD的多种变体进行了研究,主要包括JS散度等,主要是为了探究KLD的不对称性对结果的影响大不大。
04
文章一共使用了7个数据集,在不同检测器上进行了非常充足的实验。首先我们对KLD不同变体在两个数据集上进行了实验,发现最后的效果是差不多的,排除了不对称性对结果的干扰。
然后我们在3种数据集和2种检测器上进行了高精度检测实验,我们发现KLD几乎吊打另外两种损失函数。
随后我们在一些更具有挑战性的数据集上进行了验证实验,包括DOTA-v1.5和DOTA-v2.0(包含很多像素值小于10的目标),KLD依旧表现出色。我们还在相同环境下做了不同方法(均在我开源的benchmark上支持)的对比实验,KLD几乎也是在各方面胜出。在水平检测任务上(COCO数据集),KLD也是和GIoU等常见损失函数保持差不多的水平。
最后在DOTA-v1.0的SOTA实验中,我们也取得了当前所发表论文里的最高性能。
05
尽管KLD看起来很完美,但是也存在一些问题,比如两个相同大小相同位置的正方形目标,其中一个正方形不管怎么旋转,KLD的值始终是0,因为此时高斯分布是一个圆形的,而实际的IoU是在变化的。还有一个问题是,KLD依旧局限于旋转矩形的检测,无法直接扩展在四边形或者多边形的检测。有问题是好事,大家可以接着改进接着发paper嘛~.~如果大佬们有什么改进想法或者相关的idea,欢迎找我交流,微信或者知乎都可。我的主页有我的微信,当然非诚勿扰。
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“源头活水”历史文章
更多源头活水专栏文章,
请点击文章底部“阅读原文”查看
分享、在看,给个三连击呗!